# -*- coding: utf-8 -*-
from MediaCollection.Database import Database
from Exceptions.LibraryException import LibraryException

"""
Die Genre-Klasse repräsentiert ein Genre mit allen in der Datenbank 
gespeicherten Attributen. Über ein Objekt dieser Klasse können neue Einträge in 
die Datenbank eingefügt werden, im Gegenzug aber auch über die Id des Eintrags 
in der Datenbank die entsprechenden Informationen in das Objekt eingelesen 
werden.

@author: Philipp Dermitzel
@date: 2011-03-31
@version: 1.5.1
"""
class Genre(object):

    """
    ----------------------------------------------------------------------------
    Konstruktor
    ----------------------------------------------------------------------------
    """
    
    """
    Der  Konstruktor. Erstellt das Objekt und liest, falls eine ID übergeben 
    wird, die entsprechenden Daten aus der Datenbank ein.
    @param id: Wird eine ID übergeben, so werden die Daten des entsprechenden 
        Genres direkt eingelesen.
    @type id: int
    @param name: Wird ein Name übergeben, so werden die Daten des entsprechenden
        Genres direkt eingelesen.
    @type name: String
    """
    def __init__(self, id = None, name = None): 
        """
        Speichert alle Informationen des Genres. Ist über C(getData()) abrufbar.
        @type: Dictionary
        """
        self.__genreData = {
             'id' : None,
             'name' : None
        }
        
        if id is not None:
            self.__genreData['id'] = id
            self.getDataFromDb()
        elif name is not None:
            self.__genreData['name'] = name
            self.getDataFromDb()
    
    """
    ----------------------------------------------------------------------------
    Getter und Setter
    ----------------------------------------------------------------------------
    """
    
    """
    Setzt die Attribute des Genres um dieses später erfolgreich in die Datenbank
    einfügen zu können. Dafür sollte das übergebene Dictionary C(dataDict) alle 
    eben dort beschriebenen Informationen enthalten.    
    @param dataDict: Alle benötigten Informationen zum Genre. Die momentan 
    genutzten Felder sind: id und name.
    @type dataDict: Dictionary
    @return: Das 'self'-Objekt (für Chaining)
    @rtype: Genre
    """
    def setData(self, dataDict):
        if 'id' in dataDict:
            self.__genreData['id'] = dataDict['id']
        if 'name' in dataDict:
            self.__genreData['name'] = dataDict['name']
        return self
    
    """
    Setzt ein einzelnen Attribut des Genres. Die momentan genutzten Felder sind:
    id und name.
    @param key: Der Schlüssel.
    @type key: String
    @param value: Der zu setzende Wert.
    @type value: int oder String
    @return: Das 'self'-Objekt (für Chaining)
    @rtype: Genre
    """
    def setValue(self, key, value):
        if key == "id":
            self.__genreData['id'] = value
        elif key == "name":
            self.__genreData['name'] = value
        else: 
            raise LibraryException("\"%s\" ist kein valider Parameter" %key)
        return self
    
    """
    Getter
    @return: Alle Genre-Daten.
    @rtype: Dictionary
    """
    def getData(self):
        return self.__genreData
    
    """
    Getter.
    @return: Die ID des Genres in der Datenbank.
    @rtype: int
    """
    def getId(self):
        return self.__genreData['id']
    
    """
    Getter.
    @return: Der Name des Genres.
    @rtype: String
    """
    def getName(self):
        return self.__genreData['name']
   
    """
    ----------------------------------------------------------------------------
    Methoden der Klasse
    ----------------------------------------------------------------------------
    """
    
    """
    Liest die Genre-Daten aus der Datenbank.
    @return: Das 'self'-Objekt (für Chaining)
    @rtype: Genre
    """
    def getDataFromDb(self):
        if self.__genreData['name'] is not None:
            arguments = {'name':self.__genreData['name']}
        elif self.__genreData['id'] is not None:
            arguments = {'id':self.__genreData['id']}
        else: 
            raise LibraryException('Keine ID übergeben')
        
        db = Database()
        try: 
            db.select('*', 'Genre', arguments)
            curGenre = db.dbCursor.fetchone()
            self.__genreData['id'] = curGenre[0]
            self.__genreData['name'] = curGenre[1]
        except Exception:
            raise LibraryException('Genre nicht vorhanden')
        return self
    
    """
    Speichert die Genre-Daten in der Datenbank.
    @return: Das 'self'-Objekt (für Chaining)
    @rtype: Genre
    """   
    def insertIntoDb(self):
        if (self.__genreData['name'] is not None):
            db = Database()
            db.savepoint("sp")
            try: 
                db.insert('Genre', {'name':self.__genreData['name']})
                self.__genreData['id'] = db.dbCursor.lastrowid
                self.getDataFromDb()
            except Exception:
                db.rollback("sp")
                raise LibraryException('Konnte Daten nicht einfügen')
        else: 
            raise LibraryException('Nicht alle Daten vorhanden')
        return self
        
    """
    Löscht ein Genre aus der Datenbank.
    @return: Das 'self'-Objekt (für Chaining)
    @rtype: Genre
    """    
    def deleteFromDb(self):
        if self.__genreData['id'] is None:
            self.getDataFromDb()
        db = Database()
        try: 
            db.delete('Genre', {'id':self.__genreData['id']})
        except: raise LibraryException('Genre nicht vorhanden')
        return self
